#ifndef __BST_H__
#define __BST_H__

#include <stddef.h> // 提供 size_t 类型

// 定义二叉树节点结构
typedef struct node_t {
    struct node_t *left;    // 左子树
    struct node_t *right;   // 右子树
    char data[0];           // 数据域，采用可变长结构体的形式。可以存储任何类型的数据
} node_t;

// 定义二叉排序树结构
typedef struct bst_t {
    node_t *root;           // 树的根节点
    size_t num;             // 树的大小（节点数量）
    size_t size;            // 数据元素的字节大小
    int (*cmp)(const void *data, const void *key); // 比较函数指针
} bst_t;

// 树的初始化
int bst_init(bst_t **tree, size_t size, int (*cmp)(const void *data, const void *key));

// 清空树
void bst_clear(bst_t *tree);

// 销毁树并释放内存
void bst_destroy(bst_t **tree);

// 获取树的大小（节点数量）
size_t bst_size(const bst_t *tree);

// 插入数据
int bst_insert(bst_t *tree, const void *data);

// 查找数据
void *bst_search(const bst_t *tree, const void *key);

// 删除数据
int bst_delete(bst_t *tree, const void *key);

// 中序遍历
void bst_inorder(const bst_t *tree, void (*func)(const void *data));

#endif

